#include <stdio.h>
#include <string.h>
#include <openssl/des.h> // 引入 OpenSSL 中的 DES 相关函数和结构

void handleErrors() {
    fprintf(stderr, "Error occurred\n"); // 打印错误信息
    exit(1); // 退出程序
}

// DES 加密函数
void des_encrypt(const char *key, const unsigned char *plaintext, unsigned char *ciphertext) {
    DES_cblock key2; // DES 密钥块
    DES_key_schedule schedule; // DES 密钥调度

    // 将字符数组转换为 DES 密钥
    strncpy((char *)key2, key, 8); // 复制前 8 字节作为密钥
    DES_set_key_unchecked(&key2, &schedule); // 设置 DES 密钥

    DES_ecb_encrypt((DES_cblock *)plaintext, (DES_cblock *)ciphertext, &schedule, DES_ENCRYPT); // 执行 ECB 模式加密
}

// DES 解密函数
void des_decrypt(const char *key, const unsigned char *ciphertext, unsigned char *plaintext) {
    DES_cblock key2; // DES 密钥块
    DES_key_schedule schedule; // DES 密钥调度

    // 将字符数组转换为 DES 密钥
    strncpy((char *)key2, key, 8); // 复制前 8 字节作为密钥
    DES_set_key_unchecked(&key2, &schedule); // 设置 DES 密钥

    DES_ecb_encrypt((DES_cblock *)ciphertext, (DES_cblock *)plaintext, &schedule, DES_DECRYPT); // 执行 ECB 模式解密
}

int main() {
    const char *key = "12345678"; // DES 使用的 8 字节密钥
    const unsigned char plaintext[8] = "ABCDEFGH"; // 明文，必须是 8 字节
    unsigned char ciphertext[8]; // 存放加密后的密文
    unsigned char decryptedtext[8]; // 存放解密后的明文

    // 打印原始明文
    printf("Plaintext: %s\n", plaintext);

    // 进行加密
    des_encrypt(key, plaintext, ciphertext);
    printf("Ciphertext (in hex): ");
    for (int i = 0; i < 8; i++) {
        printf("%02x", ciphertext[i]); // 打印加密后的密文，十六进制格式
    }
    printf("\n");

    // 进行解密
    des_decrypt(key, ciphertext, decryptedtext);
    decryptedtext[8] = '\0'; // 添加字符串结束符
    printf("Decrypted text: %s\n", decryptedtext); // 打印解密后的明文

    return 0; // 程序正常结束
}
